--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
recipes/hostpython3/__init__.py HEAD (8b8a5035) Text, 6.05 KB
Tff7b72import T7ee787sh
Tff7b72import T7ee787os
Tff7b72from T7ee787multiprocessing Tff7b72import Te6edf3cpu_count
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72from T7ee787osT7ee787.T7ee787path Tff7b72import Te6edf3join
Tff7b72from T7ee787packagingT7ee787.T7ee787version Tff7b72import Te6edf3Version
Tff7b72from T7ee787pythonforandroidT7ee787.T7ee787logger Tff7b72import Te6edf3shprint
Tff7b72from T7ee787pythonforandroidT7ee787.T7ee787recipe Tff7b72import Te6edf3Recipe
Tff7b72from T7ee787pythonforandroidT7ee787.T7ee787util Tff7b72import Tb4b4b4(
Te6edf3BuildInterruptingExceptionTb4b4b4,
Te6edf3current_directoryTb4b4b4,
Te6edf3ensure_dirTb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787pythonforandroidT7ee787.T7ee787prerequisites Tff7b72import Te6edf3OpenSSLPrerequisite
Te6edf3HOSTPYTHON_VERSION_UNSET_MESSAGE Tff7b72= Tb4b4b4(
Ta5d6ff'Ta5d6ffThe hostpython recipe must have set versionTa5d6ff'
Tb4b4b4)
Te6edf3SETUP_DIST_NOT_FIND_MESSAGE Tff7b72= Tb4b4b4(
Ta5d6ff'Ta5d6ffCould not find Setup.dist or Setup in Python buildTa5d6ff'
Tb4b4b4)
Tff7b72class T56d364HostPython3RecipeTb4b4b4(Te6edf3RecipeTb4b4b4)Tb4b4b4:
T8b949e'''
The hostpython3's recipe.
.. versionchanged:: 2019.10.06.post0
Refactored from deleted class ``python.HostPythonRecipe`` into here.
.. versionchanged:: 0.6.0
Refactored into the new class
:class:`~pythonforandroid.python.HostPythonRecipe`
'''
Te6edf3version Tff7b72= Ta5d6ff'Ta5d6ff3.11.5Ta5d6ff'
Te6edf3name Tff7b72= Ta5d6ff'Ta5d6ffhostpython3Ta5d6ff'
Te6edf3build_subdir Tff7b72= Ta5d6ff'Ta5d6ffnative-buildTa5d6ff'
T8b949e'''Specify the sub build directory for the hostpython3 recipe. Defaults
to ``native-build``.'''
Te6edf3url Tff7b72= Ta5d6ff'Ta5d6ffhttps://www.python.org/ftp/python/Tffd700{version}Ta5d6ff/Python-Tffd700{version}Ta5d6ff.tgzTa5d6ff'
T8b949e'''The default url to download our host python recipe. This url will
change depending on the python version set in attribute :attr:`version`.'''
Te6edf3patches Tff7b72= Tb4b4b4[Ta5d6ff'Ta5d6ffpatches/pyconfig_detection.patchTa5d6ff'Tb4b4b4]
Tf0883e@property
Tff7b72def Td2a8ff_exe_nameTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e'''
Returns the name of the python executable depending on the version.
'''
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffversionTb4b4b4:
Tff7b72raise Te6edf3BuildInterruptingExceptionTb4b4b4(Te6edf3HOSTPYTHON_VERSION_UNSET_MESSAGETb4b4b4)
Tff7b72return Ta5d6fffTa5d6ff'Ta5d6ffpythonTffd700{Tff7b72selfTff7b72.Td2a8ffversionTff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff.Ta5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tffd700}Ta5d6ff'
Tf0883e@property
Tff7b72def Td2a8ffpython_exeTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e'''Returns the full path of the hostpython executable.'''
Tff7b72return Te6edf3joinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_path_to_pythonTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ff_exe_nameTb4b4b4)
Tff7b72def Td2a8ffget_recipe_envTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3archTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3env Tff7b72= Te6edf3osTff7b72.Td2a8ffenvironTff7b72.Td2a8ffcopyTb4b4b4(Tb4b4b4)
Te6edf3openssl_prereq Tff7b72= Te6edf3OpenSSLPrerequisiteTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffPKG_CONFIG_PATHTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3envTb4b4b4[Ta5d6ff"Ta5d6ffPKG_CONFIG_PATHTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3osTff7b72.Td2a8ffpathsepTff7b72.Td2a8ffjoinTb4b4b4(
Tb4b4b4[Te6edf3openssl_prereqTff7b72.Td2a8ffpkg_config_locationTb4b4b4, Te6edf3envTb4b4b4[Ta5d6ff"Ta5d6ffPKG_CONFIG_PATHTa5d6ff"Tb4b4b4]Tb4b4b4]
Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3envTb4b4b4[Ta5d6ff"Ta5d6ffPKG_CONFIG_PATHTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3openssl_prereqTff7b72.Td2a8ffpkg_config_location
Tff7b72return Te6edf3env
Tff7b72def Td2a8ffshould_buildTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3archTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3PathTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpython_exeTb4b4b4)Tff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)Tb4b4b4:
T8b949e# no need to build, but we must set hostpython for our Context
Tff7b72selfTff7b72.Td2a8ffctxTff7b72.Td2a8ffhostpython Tff7b72= Tff7b72selfTff7b72.Td2a8ffpython_exe
Tff7b72return Tff7b72False
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffget_build_container_dirTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3archTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3choices Tff7b72= Tff7b72selfTff7b72.Td2a8ffcheck_recipe_choicesTb4b4b4(Tb4b4b4)
Te6edf3dir_name Tff7b72= Ta5d6ff'Ta5d6ff-Ta5d6ff'Tff7b72.Td2a8ffjoinTb4b4b4(Tb4b4b4[Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4] Tff7b72+ Te6edf3choicesTb4b4b4)
Tff7b72return Te6edf3joinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffctxTff7b72.Td2a8ffbuild_dirTb4b4b4, Ta5d6ff'Ta5d6ffother_buildsTa5d6ff'Tb4b4b4, Te6edf3dir_nameTb4b4b4, Ta5d6ff'Ta5d6ffdesktopTa5d6ff'Tb4b4b4)
Tff7b72def Td2a8ffget_build_dirTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3archTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e'''
.. note:: Unlike other recipes, the hostpython build dir doesn't
depend on the target arch
'''
Tff7b72return Te6edf3joinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_build_container_dirTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4)
Tff7b72def Td2a8ffget_path_to_pythonTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3joinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_build_dirTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffbuild_subdirTb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffsite_rootTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3joinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_path_to_pythonTb4b4b4(Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffrootTa5d6ff"Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffsite_binTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3joinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsite_rootTb4b4b4, Tff7b72selfTff7b72.Td2a8ffsite_dirTb4b4b4, Ta5d6ff"Ta5d6ffbinTa5d6ff"Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8fflocal_binTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3joinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsite_rootTb4b4b4, Ta5d6ff"Ta5d6ffusr/local/bin/Ta5d6ff"Tb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffsite_dirTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3p_version Tff7b72= Te6edf3VersionTb4b4b4(Tff7b72selfTff7b72.Td2a8ffversionTb4b4b4)
Tff7b72return Te6edf3joinTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffsite_rootTb4b4b4,
Ta5d6fffTa5d6ff"Ta5d6ffusr/local/lib/pythonTffd700{Te6edf3p_versionTff7b72.Td2a8ffmajorTffd700}Ta5d6ff.Tffd700{Te6edf3p_versionTff7b72.Td2a8ffminorTffd700}Ta5d6ff/site-packages/Ta5d6ff"
Tb4b4b4)
Tff7b72def Td2a8ffbuild_archTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3archTb4b4b4)Tb4b4b4:
Te6edf3env Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_recipe_envTb4b4b4(Te6edf3archTb4b4b4)
Te6edf3recipe_build_dir Tff7b72= Tff7b72selfTff7b72.Td2a8ffget_build_dirTb4b4b4(Te6edf3archTff7b72.Td2a8ffarchTb4b4b4)
T8b949e# Create a subdirectory to actually perform the build
Te6edf3build_dir Tff7b72= Te6edf3joinTb4b4b4(Te6edf3recipe_build_dirTb4b4b4, Tff7b72selfTff7b72.Td2a8ffbuild_subdirTb4b4b4)
Te6edf3ensure_dirTb4b4b4(Te6edf3build_dirTb4b4b4)
T8b949e# Configure the build
Te6edf3build_configured Tff7b72= Tff7b72False
Tff7b72with Te6edf3current_directoryTb4b4b4(Te6edf3build_dirTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3PathTb4b4b4(Ta5d6ff'Ta5d6ffconfig.statusTa5d6ff'Tb4b4b4)Tff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3shprintTb4b4b4(Te6edf3shTff7b72.Td2a8ffCommandTb4b4b4(Te6edf3joinTb4b4b4(Te6edf3recipe_build_dirTb4b4b4, Ta5d6ff'Ta5d6ffconfigureTa5d6ff'Tb4b4b4)Tb4b4b4)Tb4b4b4, Te6edf3_envTff7b72=Te6edf3envTb4b4b4)
Te6edf3build_configured Tff7b72= Tff7b72True
Tff7b72with Te6edf3current_directoryTb4b4b4(Te6edf3recipe_build_dirTb4b4b4)Tb4b4b4:
T8b949e# Create the Setup file. This copying from Setup.dist is
T8b949e# the normal and expected procedure before Python 3.8, but
T8b949e# after this the file with default options is already named "Setup"
Te6edf3setup_dist_location Tff7b72= Te6edf3joinTb4b4b4(Ta5d6ff'Ta5d6ffModulesTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffSetup.distTa5d6ff'Tb4b4b4)
Tff7b72if Te6edf3PathTb4b4b4(Te6edf3setup_dist_locationTb4b4b4)Tff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3shprintTb4b4b4(Te6edf3shTff7b72.Td2a8ffcpTb4b4b4, Te6edf3setup_dist_locationTb4b4b4,
Te6edf3joinTb4b4b4(Te6edf3build_dirTb4b4b4, Ta5d6ff'Ta5d6ffModulesTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffSetupTa5d6ff'Tb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# Check the expected file does exist
Te6edf3setup_location Tff7b72= Te6edf3joinTb4b4b4(Ta5d6ff'Ta5d6ffModulesTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffSetupTa5d6ff'Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3PathTb4b4b4(Te6edf3setup_locationTb4b4b4)Tff7b72.Td2a8ffexistsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72raise Te6edf3BuildInterruptingExceptionTb4b4b4(
Te6edf3SETUP_DIST_NOT_FIND_MESSAGE
Tb4b4b4)
Te6edf3shprintTb4b4b4(Te6edf3shTff7b72.Td2a8ffmakeTb4b4b4, Ta5d6ff'Ta5d6ff-jTa5d6ff'Tb4b4b4, Tffa657strTb4b4b4(Te6edf3cpu_countTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4, Ta5d6ff'Ta5d6ff-CTa5d6ff'Tb4b4b4, Te6edf3build_dirTb4b4b4, Te6edf3_envTff7b72=Te6edf3envTb4b4b4)
T8b949e# make a copy of the python executable giving it the name we want,
T8b949e# because we got different python's executable names depending on
T8b949e# the fs being case-insensitive (Mac OS X, Cygwin...) or
T8b949e# case-sensitive (linux)...so this way we will have an unique name
T8b949e# for our hostpython, regarding the used fs
Tff7b72for Te6edf3exe_name Tff7b72in Tb4b4b4[Ta5d6ff'Ta5d6ffpython.exeTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffpythonTa5d6ff'Tb4b4b4]Tb4b4b4:
Te6edf3exe Tff7b72= Te6edf3joinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffget_path_to_pythonTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3exe_nameTb4b4b4)
Tff7b72if Te6edf3PathTb4b4b4(Te6edf3exeTb4b4b4)Tff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3shprintTb4b4b4(Te6edf3shTff7b72.Td2a8ffcpTb4b4b4, Te6edf3exeTb4b4b4, Tff7b72selfTff7b72.Td2a8ffpython_exeTb4b4b4)
Tff7b72break
Te6edf3ensure_dirTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsite_rootTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffctxTff7b72.Td2a8ffhostpython Tff7b72= Tff7b72selfTff7b72.Td2a8ffpython_exe
Tff7b72if Te6edf3build_configuredTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRUNNING ENSUREPIP:Ta5d6ff"Tff7b72+Tff7b72selfTff7b72.Td2a8ffsite_rootTb4b4b4)
Te6edf3shprintTb4b4b4(
Te6edf3shTff7b72.Td2a8ffCommandTb4b4b4(Tff7b72selfTff7b72.Td2a8ffpython_exeTb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ff-mTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffensurepipTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ff--rootTa5d6ff"Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffsite_rootTb4b4b4, Ta5d6ff"Ta5d6ff-UTa5d6ff"Tb4b4b4,
Te6edf3_envTff7b72=Tb4b4b4{Ta5d6ff"Ta5d6ffHOMETa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff/tmpTa5d6ff"Tb4b4b4}
Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffRAN ENSUREPIPTa5d6ff"Tb4b4b4)
Te6edf3recipe Tff7b72= Te6edf3HostPython3RecipeTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────